//
// Created by Administrator on 2020/6/3 0003.
//

#ifndef SECURITY_DETECT_H
#define SECURITY_DETECT_H

#include <jni.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include "md5.h"
//#include "AESUtils.h"
//#include "RSAUtils.h"
#include "common.h"

#ifdef __cplusplus
extern "C" {
#endif

#define LEN 13
#define BUFFER_LEN 512

/**
 * 检测到 debugger 模式打开
 */
#define KILL_APP_DEBUGGER  101
/**
 * 检测到签名被修改
 */
#define KILL_APP_APP_SIGN 102

/**
 * 检测到系统为可调式
 */
#define KILL_APP_SYSTEM_DEBUGGABLE 103

/**
 * 检测到IDA 调试
 */
#define KILL_APP_IDA 104

/**
 * 检测到trace pid 不为0 被ptrace 注入
 */
#define KILL_APP_TRACE_PID 105

/**
 * 检测到 frida port
 */
#define KILL_APP_FRIDA_PORT 106

/**
 * 在内存中扫描到Frida
 */
#define KILL_APP_FRIDA_MEMORY 107

//#define DEBUG
typedef struct Entity *pEntity;
typedef struct Entity {
    const char *key;
    jobject value;
} Entity;

static pEntity gRefMap[LEN];
static jobject lRefList[LEN];

static void gRefMapAdd(const char *key, jobject value, int index);

static jobject gRefMapGet(const char *key);

static void gRefMapClear();

static void lRefListClear();

static void addLocalAndGlobalRef(JNIEnv *jniEnv, const char *name, jobject obj, int localIndex,
                                 int globalIndex);

static void cacheClazz(JNIEnv *jniEnv, jobject thiz, jobject pJobject);


/**
 * bugly 上传关闭应用的原因
 */
void reportRemote(JNIEnv *jniEnv, size_t type);

/**
 * 杀死进程
 */
static void killApp();

/**
 * 检测 frida 默认监听的端口号27042
 */
static int detectionFridaPort();


/**
 * 检测异常
 * @param env
 * @return
 */
int checkExc(JNIEnv *env);

/**
 * 检测调试器状态
 * @return
 */
static int isDebuggerConnected(JNIEnv *env);

/**
 * IDA PRO 调试器端口检测
 */
static int checkIdaServer();

/**
 * 检测进程状态
 */
static int checkPidStatus();

/**
 * 监测线程
 */
static void detectThread();

static int checkSystemDebuggerAble();

void check(JNIEnv *jniEnv, jobject thiz, jobject context);

#ifdef __cplusplus
}
#endif

#endif //SECURITY_DETECT_H
